package com.anc.platform.utils;

import enums.CommonIntEnum;
import exception.AncException;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;

/**
 * 枚举工具类
 *
 * @author caoyuan
 * @return
 * @date 2021/7/15 上午 11:26
 * @since V1.0
 */
public class EnumUtil {

    /**
     * 根据code属性值,获取继承自CommonIntEnum的枚举类
     *
     * @param code      属性值
     * @param enumClass 枚举类.class
     * @return 枚举对象
     */
    public static <T extends CommonIntEnum> T getByCode(Integer code, Class<T> enumClass) {
        for (T each : enumClass.getEnumConstants()) {
            if (each.getCode() == code) {
                return each;
            }
        }
        return null;
    }

    /**
     * 只验证code属性的
     *
     * @param code      属性值
     * @param enumClass 枚举类.class
     * @return 枚举对象
     */
    public static <T> T getEnumByCode(Object code, Class<T> enumClass) {
        if (code == null) {
            return null;
        }
        return getEnumByFieldName("code", code, enumClass);
    }

    /**
     * 根据属性名取出枚举对象
     * 举例:ApproveStatusEnum statusEnum = getEnumByField("code", 1, ApproveStatusEnum.class);
     *
     * @param fieldName  属性名:"code"
     * @param fieldValue 属性值:4
     * @param enumClass  枚举类.class
     * @param <T>        枚举对象
     * @return
     */
    public static <T> T getEnumByFieldName(String fieldName, Object fieldValue, Class<T> enumClass) {
        if (fieldValue == null) {
            return null;
        }
        try {
            Method getField = enumClass.getMethod("get" + StringUtils.capitalize(fieldName));
            for (T item : enumClass.getEnumConstants()) {
                Object invoke = getField.invoke(item);
                if (fieldValue.equals(invoke)) {
                    return item;
                }
            }
        } catch (Exception e) {
            throw new AncException("枚举类属性错误,未找到" + fieldName + "属性");
        }
        return null;
    }

//    /**
//     * 根据lambda的get方法取出枚举对象
//     * 举例:ApproveTypeEnum enumByField = EnumUtil.getEnumByField(ApproveTypeEnum::getMessage, "结算单审核");
//     *
//     * @param fieldValue 属性值:"结算单审核"
//     * @param lambdaGet  lambda的get方法:  ApproveTypeEnum::getMessage
//     * @param <T>        枚举对象
//     * @return
//     */
//    public static <T> T getEnumByLambdaGet(Object fieldValue, com.helian.facade.util.TypeFunction<T, ?> lambdaGet) {
//        if (lambdaGet == null || fieldValue == null) {
//            return null;
//        }
//        String fieldName = com.helian.facade.util.TypeFunction.getFieldName(lambdaGet);
//        Class<T> enumClass = com.helian.facade.util.TypeFunction.getClass(lambdaGet);
//        return getEnumByFieldName(fieldName, fieldValue, enumClass);
//    }
}
